// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "SQLObjectImpl.h"
#include "SQLObjectWithDataType.h"
#include "../../utils/common_ptr.h"

class SQLParameter_ParameterType
{
public:
  static SQLParameter_ParameterType DEFAULT;
  static SQLParameter_ParameterType IN;    // in
  static SQLParameter_ParameterType OUT;   // out
  static SQLParameter_ParameterType INOUT; // inout

  uint64_t mask;
  string_ptr name;
  SQLParameter_ParameterType(uint64_t mask, string_ptr name);
  SQLParameter_ParameterType(SQLParameter_ParameterType *parameterType);
};

class SQLParameter : public SQLObjectImpl, virtual public SQLObjectWithDataType
{
public:
  SQLName_ptr name;
  SQLDataType_ptr dataType;
  SQLExpr_ptr defaultValue;
  SQLParameter_ParameterType_ptr paramType;
  BOOL_ptr noCopy;
  BOOL_ptr constant;
  SQLName_ptr cursorName;
  SQLParameter_list_ptr cursorParameters;
  BOOL_ptr order;
  BOOL_ptr map;
  BOOL_ptr member;

  SQLParameter();
  SHAREDOBJECT(SQLParameter);
  SQLExpr_ptr getDefaultValue();

  void setDefaultValue(SQLExpr_ptr deaultValue);

  SQLName_ptr getName();

  void setName(SQLName_ptr name);

  SQLDataType_ptr getDataType();

  void setDataType(SQLDataType_ptr dataType);

  SQLParameter_ParameterType_ptr getParamType();

  void setParamType(SQLParameter_ParameterType_ptr paramType);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  BOOL_ptr isNoCopy();

  void setNoCopy(BOOL_ptr noCopy);

  BOOL_ptr isConstant();

  void setConstant(BOOL_ptr constant);

  SQLParameter_list_ptr getCursorParameters();

  SQLName_ptr getCursorName();

  void setCursorName(SQLName_ptr cursorName);

  SQLObject_ptr clone();

  BOOL_ptr isOrder();

  void setOrder(BOOL_ptr order);

  BOOL_ptr isMap();

  void setMap(BOOL_ptr map);

  BOOL_ptr isMember();

  void setMember(BOOL_ptr member);
};
